package co.com.fenoco.encuentas.servicios;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.ejb.Stateless;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TemporalType;

import co.com.fenoco.encuentas.persistencia.DetalleEncuesta;
import co.com.fenoco.encuentas.persistencia.DetalleFotografico;
import co.com.fenoco.encuentas.persistencia.EncabezadoEncuestas;
import co.com.fenoco.encuentas.persistencia.Respuesta;
import co.com.fenoco.encuentas.servicios.dto.FiltroConsultaEncuestasDTO;

/**
 * Session Bean implementation class Encuestas
 */
@Stateless
public class EncuestasBean implements IEncuestasRemote, IEncuestasLocal {
	/**
	 * El contexto de persistencia.
	 */
	@PersistenceContext
	private EntityManager em;

	/**
	 * Default constructor.
	 */
	public EncuestasBean() {
		// TODO Auto-generated constructor stub
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * co.com.fenoco.encuentas.persistencia.IEncuestasRemote#adicionarEncuesta
	 * (co.com.fenoco.encuentas.persistencia.EncabezadoEncuestas)
	 */
	@Override
	public void adicionarEncuesta(EncabezadoEncuestas encuesta) {
		DetalleEncuesta detalleEncuesta = encuesta.getDetalleEncuesta();
		encuesta.setFechaModificacion(Calendar.getInstance());
		if (encuesta.getId() == null) {
			encuesta.setFechaDiligencia(Calendar.getInstance());
			em.persist(encuesta);
		} else {
			encuesta.setFechaModificacion(Calendar.getInstance());
			em.merge(encuesta);
			Query q = em.createQuery ("DELETE FROM DetalleFotografico d WHERE d.idEncabezado=:idEncabezado");
			q.setParameter("idEncabezado", encuesta.getId());
			q.executeUpdate ();
		}

		if (detalleEncuesta != null) {
			detalleEncuesta.setEncabezadoEncuestas(encuesta.getId());
			em.merge(detalleEncuesta);
			if(detalleEncuesta.getArchivos()!=null && !detalleEncuesta.getArchivos().isEmpty()){
				for(DetalleFotografico det:detalleEncuesta.getArchivos()){
					det.setFoto(det.getNombreArchivo());
					det.setIdEncabezado(encuesta.getId());
					det.setFechaCarga(Calendar.getInstance());
					em.persist(det);
				}
			}
			
		}
		

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * co.com.fenoco.encuentas.persistencia.IEncuestasRemote#eliminarEncuesta
	 * (co.com.fenoco.encuentas.persistencia.EncabezadoEncuestas)
	 */
	@Override
	public void eliminarEncuesta(EncabezadoEncuestas encuesta) {
		em.remove(encuesta);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * co.com.fenoco.encuentas.persistencia.IEncuestasRemote#modificarEncuesta
	 * (co.com.fenoco.encuentas.persistencia.EncabezadoEncuestas)
	 */
	@Override
	public void modificarEncuesta(EncabezadoEncuestas encuesta) {
		em.merge(encuesta);
		em.flush();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * co.com.fenoco.encuentas.persistencia.IEncuestasRemote#consultarEncuesta
	 * (co.com.fenoco.encuentas.persistencia.EncabezadoEncuestas)
	 */
	@Override
	public EncabezadoEncuestas consultarEncuesta(EncabezadoEncuestas encuesta) {
		EncabezadoEncuestas retorno = em.find(EncabezadoEncuestas.class,
				encuesta.getId());
		retorno.setDetalleEncuesta(em.find(DetalleEncuesta.class,
				encuesta.getId()));
		return retorno;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * co.com.fenoco.encuentas.persistencia.IEncuestasRemote#consultarEncuestas
	 * (co.com.fenoco.encuentas.persistencia.EncabezadoEncuestas)
	 */
	@Override
	public List<EncabezadoEncuestas> consultarEncuestas(
			FiltroConsultaEncuestasDTO filtro) {
		// Query query = em.createNamedQuery("findEncuestas");
		// query.setParameter("encuestador", filtro.getEncuestador());
		// query.
		// return new ArrayList<EncabezadoEncuestas>(query.getResultList());
		String query = "SELECT enc FROM EncabezadoEncuestas enc,DetalleEncuesta det WHERE det.encabezadoEncuestas=enc.id AND enc.encuestador = :encuestador";
		String where = "";
		boolean filtroEtiqueta = false;
		boolean filtroFechaDiligenciaIni = false;
		boolean filtroFechaDiligenciaFin = false;
		boolean filtroFechaModificaIni = false;
		boolean filtroFechaModificaFin = false;
		boolean filtroEtiquetaInstalada = false;
		boolean filtroNombre = false;
		boolean filtroCedula = false;
		if (filtro.getEtiqueta() != null
				&& !filtro.getEtiqueta().trim().isEmpty()) {
			where += " AND UPPER(enc.etiqueta) LIKE :etiqueta";
			filtroEtiqueta = true;
		}
		if (filtro.getNombre() != null
				&& !filtro.getNombre().trim().isEmpty()) {
			where += " AND UPPER(det.nombrePropietario) LIKE :nombre";
			filtroNombre = true;
		}
		if (filtro.getCedula()!= null
				&& !filtro.getCedula().trim().isEmpty()) {
			where += " AND UPPER(det.identificacion) LIKE :cedula";
			filtroCedula = true;
		}
		
		if(filtro.getEtiquetaInstalada()!=null && !filtro.getEtiquetaInstalada().trim().isEmpty()){
			where += " AND enc.etiquetaInstalada=:etiquetaInstalada";
			filtroEtiquetaInstalada = true;
		}
		

		if (filtro.getFechaDiligenciaIni() != null
				&& filtro.getFechaDiligenciaFin() != null) {
			where += " AND enc.fechaDiligencia BETWEEN :fechaDiligenciaIni AND :fechaDiligenciaFin";
			filtroFechaDiligenciaIni = true;
			filtroFechaDiligenciaFin = true;
		} else if (filtro.getFechaDiligenciaIni() != null) {
			where += " AND enc.fechaDiligencia >= :fechaDiligenciaIni";
			filtroFechaDiligenciaIni = true;
		} else if (filtro.getFechaDiligenciaFin() != null) {
			where += " AND enc.fechaDiligencia <= :fechaDiligenciaFin";
			filtroFechaDiligenciaFin = true;
		}

		if (filtro.getFechaModificaIni() != null
				&& filtro.getFechaModificaFin() != null) {
			where += " AND enc.fechaModificacion BETWEEN :fechaModificaIni AND :fechaModificaFin";
			filtroFechaModificaIni = true;
			filtroFechaModificaFin = true;
		} else if (filtro.getFechaModificaIni() != null) {
			where += " AND enc.fechaModificacion >= :fechaModificaIni";
			filtroFechaModificaIni = true;
		} else if (filtro.getFechaModificaFin() != null) {
			where += " AND enc.fechaModificacion <= :fechaModificaFin";
			filtroFechaModificaFin = true;
		}
		
		Query q = em.createQuery(query + where).setParameter("encuestador",
				filtro.getEncuestador());

		if (filtroEtiqueta)
			q.setParameter("etiqueta", "%"+filtro.getEtiqueta().toUpperCase()+"%");
		if (filtroFechaDiligenciaIni)
			q.setParameter("fechaDiligenciaIni",
					filtro.getFechaDiligenciaIni(), TemporalType.TIMESTAMP);
		if (filtroFechaDiligenciaFin)
			q.setParameter("fechaDiligenciaFin",
					filtro.getFechaDiligenciaFin(), TemporalType.TIMESTAMP);
		if (filtroFechaModificaIni)
			q.setParameter("fechaModificaIni", filtro.getFechaModificaIni(),
					TemporalType.TIMESTAMP);
		if (filtroFechaModificaFin)
			q.setParameter("fechaModificaFin", filtro.getFechaModificaFin(),
					TemporalType.TIMESTAMP);
		if(filtroEtiquetaInstalada)
			q.setParameter("etiquetaInstalada", filtro.getEtiquetaInstalada());
		if(filtroNombre)
			q.setParameter("nombre", "%"+filtro.getNombre().toUpperCase()+"%");
		if(filtroCedula)
			q.setParameter("cedula", "%"+filtro.getCedula().toUpperCase()+"%");
		List<EncabezadoEncuestas> encuestas = q.getResultList();
		if(encuestas!=null && !encuestas.isEmpty()){
			for(EncabezadoEncuestas enc : encuestas){
				enc.setDetalleEncuesta(em.find(DetalleEncuesta.class,
				enc.getId()));
			}
		}
		return encuestas;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * co.com.fenoco.encuentas.servicios.IEncuestasRemote#consultarListado(co
	 * .com.fenoco.encuentas.persistencia.Respuesta)
	 */
	@Override
	public List<SelectItem> consultarListado(Respuesta filtro) {
		String cadenaQuery = "SELECT r FROM Respuesta r WHERE r.preguntaId=:preguntaId and r.seccionId=:seccionId";
		Query query = em.createQuery(cadenaQuery);
		query.setParameter("seccionId", filtro.getSeccionId());
		query.setParameter("preguntaId", filtro.getPreguntaId());
		List<Respuesta> temp = query.getResultList();
		ArrayList<SelectItem> retorno = new ArrayList<SelectItem>();
		if (temp != null && !temp.isEmpty()) {
			for (Respuesta res : temp) {
				retorno.add(new SelectItem(res.getRtaid(), res.getDescripcion()));
			}
		}
		return retorno;
	}

	@Override
	public List<DetalleFotografico> consultarFotografias(
			EncabezadoEncuestas encuesta) {
		String cadenaQuery = "SELECT d FROM DetalleFotografico d WHERE d.idEncabezado=:idEncabezado";
		Query query = em.createQuery(cadenaQuery);
		query.setParameter("idEncabezado", encuesta.getId());
		return query.getResultList();
	}

}
